package util;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

public class PinyinUtil {
    /**
     *
     * @param src:获取拼音字符串
     * @param fullSpell:表示是否是全拼,比如是针对"基础语法"这样的字符串来说,如果是
     *                 true,就得到jichuyufa,是false就得到jcyf.
     * 注意:此时针对多音字,不做过多的考虑.
     * 这个PinYin4j即使是多音字,数组元素的0下标元素大概率也是最常用的发音.
     * 此时针对多音字,只取第一个发音,作为最终结果.
     * 如果要得到更精确的多音字的发音匹配,需要使用分词库,Java也有很多分词库(不如ansj),实现远离复杂
     *此处不考虑那么复杂.
     */
    public static String get(String src,boolean fullSpell){
        //trim效果就是去掉字符两侧的空白字符串
        if (src == null || src.trim().length() == 0){
            //空的字符串
            return null;
        }
        //针对PinYin4j做下调整
        //让它输出的yu这个拼音,能够使用v表示,yv.
        //格式化输出
        HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
        format.setVCharType(HanyuPinyinVCharType.WITH_V);
        //遍历每个字符,针对每个字符分别进行转换
        //把转换得到的拼音结果,拼接到StringBuilder里面
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < src.length(); i++){
            char ch = src.charAt(i);
            String[] tmp = null;
            //针对单个字符进行转换
            try {
                tmp = PinyinHelper.toHanyuPinyinStringArray(ch,format);
            } catch (BadHanyuPinyinOutputFormatCombination e) {
                e.printStackTrace();
            }
            if (tmp == null || tmp.length == 0){
                //如果是空的数组,说明转换失败了
                //如果输入的字符没有汉语拼音,就会转换失败!
                //比如输入的字符是英文字母或者是阿拉伯数字等
                //不能转换就保留原始字符,直接把原始字符加入到结果中.
                stringBuilder.append(ch);
            }else if (fullSpell){
                //拼音结果非空,并且获取到全拼
                stringBuilder.append(tmp[0]);
            }else {
                //拼音结果非空,并且获取拼音首字母.
                stringBuilder.append(tmp[0].charAt(0));
            }
        }
        //返回的是字符串类型
        return stringBuilder.toString();
    }
}
